package designPattern.structure7.Flyweight.chapter23_flyweight.test23_2;

public class Application {
    /*
      享元设计模式
      1.可以节省内存的开销：通过共享对象来避免创建太多的对象。
      几个类对象的部分属性的值是一致的，为了节省空间，也为了保证这些值一样，把这些属性抽取为一个享元类，属性值相同的几个对象共享一个享元对象。
      2.特别提醒，享元模式不仅仅是可以减少内存的，也能使外部对象都获得相同的处理。
      享元对象不仅仅存储着数据，也可以包含执行方法的
      享元可以使用方法的参数接收外部的数据。
      3.享元的安全与享元工厂
      需要确保享元的对象是不可变的，这样才能安全地共享。
      因为享元对象是用来共享的，所以不允许用户各自地使用享元类来创建对象，所以，具体享元类的构造方法必须是private的。
      创建和管理襄垣对象由享元工厂负责
      享元工厂可以通过一个散列表来管理享元对象。
      可以使用单例模式来设计享元工厂
      4.JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。
     */


    public static void main(String args[]) {
        FlyweightFactroy factroy = FlyweightFactroy.getFactroy();

        double width = 1.82, height = 1.47, length = 5.12;
        String key = "" + width + "#" + height + "#" + length;
        Flyweight flyweight = factroy.getFlyweight(key);
        Car audiA6One = new Car(flyweight, "奥迪A6", "黑色", 128);
        Car audiA6Two = new Car(flyweight, "奥迪A6", "灰色", 160);
        audiA6One.print();
        audiA6Two.print();


        width = 1.77;
        height = 1.45;
        length = 4.63;
        key = "" + width + "#" + height + "#" + length;
        flyweight = factroy.getFlyweight(key);
        Car audiA4One = new Car(flyweight, "奥迪A4", "蓝色", 126);
        Car audiA4Two = new Car(flyweight, "奥迪A4", "红色", 138);
        flyweight.printMess(" 名称：奥迪A4 颜色：蓝色 功率：126"); // 向享元传递外部数据，这点说明外部可以使用享元进行相同的处理。
        flyweight.printMess(" 名称：奥迪A4 颜色：红色 功率：138");
    }
} 
